Wstęp

Analizie poddano dane pozyskane z 17 paneli fotowoltaicznych, znajdujących się w 14 lokalizacjach w 3 różnych elektrowniach we Włoszech. Dane gromadzone były od 2 stycznia 2012 roku do 31 grudnia 2013 roku w godzinach 2:00-20:00. Ze względu na pomiary parametrów środowiska takich jak np. wilgotność, temperatura, ciśnienie, nasłonecznienie itd. dokonywane przez czujniki, które mogą ulec awarii, w zbiorze występowały wartości zerowe. Wszystkie wartości atrybutów oprócz dat zostały znormalizowane. W zbiorze obok zmierzonych wartości znajdowały się współczynniki różnych parametrów, co wskazuje, że dane te już zostały częściowo przetworzone. Celem analizy jest wskazanie atrybutów najbardziej wpływających na liczbę kWh wyprodukowanej energii. W tym celu skorzystano z macierzy korelacji. Odkryto, że najsilniej skorelowane z produkowaną energią są stopień nasłonecznienia, wilgotność, wyliczony już w zbiorze współczynnik nasłonecznienia oraz niezidentyfikowany atrybut oryginalnego zbioru irr_pvgis_mod [mode], który prawdopodobnie także jest jakimś współczynnikiem wyliczonym na podstawie wartości nasłonecznienia. Biorąc pod uwagę, że wilgotność jest silnie ujemnie skorelowana z nasłonecznienie (im większe nasłonecznienie tym mniejsza wilgotność, im większa wilgotność tym mniejsze nasłonecznienie) stwierdzono, że największy wpływ na ilość wyprodukowanej energii ma nasłonecznienie, natomiast pozostałe parametry są mało istotne. Ciekawym faktem jest to, że według macierzy korelacji godzina oraz temperatura mają niewielki wpływ na nasłonecznienie. W przypadku godziny prawdopodobnie wynika to z faktu, że analizowane dane są z całego roku, a w zależności od pory roku w danej godzinie jest zupełnie inne nasłonecznienie. W przypadku temperatury może wynikać to z faktu, że nie mamy informacji, w którym miejscu znajdował się czujnik pomiarowy, czy był on na słońcu czy w cieniu. Przy konstrukcji modelu predykcji nie można pominąć wilgotności (choć jest silnie skorelowana z nasłonecznieniem), ponieważ czujniki dokonujące pomiaru wilgotności prawdopodobnie nigdy nie uległy awarii (brak wartości zerowych w zbiorze), w przeciwieństwie do czujników nasłonecznienia. Analizując wartości wyprodukowanej energii w czasie, możemy dostrzec, że część elektrowni miała w niektórych miesiącach wartość produkcji prawie na poziomie zerowym np. styczeń 2013 dla paneli o id: 0.05, 0.075, 0.025 oraz 0.425. Nie wiadomo czy taka sytuacja wynika z awarii czujników produkowanej energii czy częściowego wyłączenia panelu na ten okres. Do wykonania regresora wykorzystano atrybuty radiation, himidity, mode, radiation_param, altitude oraz place wraz z algorytmem Random Forest (ze względu na najniższy wynik metryki RMSE w stosunko do pozostałych badanych algorytmów). Dla algorytnu Random Forest przy wykorzystaniu biblioteki caret z parametrem ntree o wartości 30 uzyskano wartość metryki RMSE dla zbioru uczącego 0.07003180 oraz 0.06831101 dla zbioru testowego przy podziale zbioru w 75% na uczący oraz 25% na testowy.

Ładowanie bibliotek

library(dplyr)
library(ggplot2) 
library('corrplot')
library(caret)
library(plotly)
library(tidyr)

Wczytywanie danych z pliku

all_data <- read.csv(file="elektrownie.csv", header=TRUE, sep=",")

Kod przetwarzający dane

Zmiana nazw kolumn

Ze względu na wykorzystanie języka włoskiego do opisu kolumn lub nieintuicyjnych nazw zdecydowano się na zmianę nazw kolumn.

needed_data <- all_data 
colnames(needed_data) <- c("measurementId", "place", "model", "brand", "latitude","longitude", "age", "year", "day", "hour", "date", "temperature", "radiation", "pressure", "windspeed", "humidity", "icon" , "dewpoint", "bearing", "cloudcover", "temp_param", "radiation_param", "pressure_param", "wind_param", "humidity_param", "dewpoint_param","bearing_param", "cloud_param", "distance", "altitude", "azimuth", "altitude_param", "azimuth_param","pcnm1", "pcnm2", "pcnm3", "pcnm4", "pcnm5", "pcnm6", "pcnm7", "pcnm8", "pcnm9", "pcnm10", "pcnm11", "pcnm12", "pcnm13", "pcnm14", "pcnm15", "mode", "mode_param","energy")

W celu łatwiejszego porównywania dat w poszczególnych wierszach (pomiarach) do zbioru dodano 4 kolumny: * only_month - kolumna typu numeric, zawiera informacje o miesiącu, wartości od 1 do 12, * only_day - kolumna typu numeric, zawiera informacje o dniu miesiąca, wartości od 1 do 31, * only_hour - kolumna typu numeric, zawiera informacje o godzinie (bez minut), wartości od 2 do 20, * date_posix - kolumna typu POSIXct, zawiera datę w formacie umożliwiiającym łatwe porównywanie dat. Dodatkowo dodano kolumne place_string zawierającą zagregowane informacje o lokalizacji danego panelu

needed_data$only_day <- as.numeric(format(as.POSIXct(factor(needed_data$date),format="%m/%d/%Y %H:%M"),"%d"))
needed_data$only_month <- as.numeric(format(as.POSIXct(factor(needed_data$date),format="%m/%d/%Y %H:%M"),"%m"))
needed_data$only_hour <- as.numeric(format(as.POSIXct(factor(needed_data$date),format="%m/%d/%Y %H:%M"),"%H"))
needed_data$date_posix <- as.POSIXct(as.character(needed_data$date), format="%m/%d/%Y %H:%M")
needed_data$place_string <- paste("Wsp: ", as.character(needed_data$latitude), " ",as.character(needed_data$longitude), " Panel: ", as.character(needed_data$place))

Uzupełnienie zerowych wartości

Wyodrębnienie modeli, marek oraz umiejscowienia czujników

W zbiorze występują dane dla 17 różnych paneli słonecznych znajdujących się w 14 różnych lokalizacji w 3 różnych elektrowniach.

Marki

idbrands <- unique(needed_data$brand)
idbrands
## [1] 0.083 0.000 0.167 0.333 0.250 0.417
paste("Liczba unikalnych marek paneli: ", length(idbrands))
## [1] "Liczba unikalnych marek paneli:  6"

Modele paneli

idbrands_with_models <- unique(needed_data[c("brand", "model")])
idbrands_with_models
##    brand model
## 1  0.083 0.083
## 2  0.083 0.208
## 3  0.000 0.375
## 4  0.167 0.292
## 5  0.333 0.000
## 6  0.000 0.417
## 7  0.000 0.458
## 8  0.167 0.167
## 11 0.250 0.250
## 14 0.417 0.125
## 15 0.333 0.750
paste("Liczba unikalnych modeli paneli: ", length(idbrands_with_models))
## [1] "Liczba unikalnych modeli paneli:  2"

Identyfikatory paneli

idplaces <- unique(needed_data$place)
idplaces
##  [1] 0.425 0.250 0.350 0.325 0.000 0.375 0.400 0.125 0.225 0.075 0.300
## [12] 0.150 0.200 0.050 0.025 0.275 0.100
paste("Liczba paneli: ", length(idplaces))
## [1] "Liczba paneli:  17"

Lokalizacje

gps <- unique(needed_data[c("latitude", "longitude")])
gps
##    latitude longitude
## 1     0.437     0.631
## 2     0.437     0.620
## 3     0.439     0.626
## 4     0.440     0.612
## 5     0.436     0.626
## 6     0.552     0.154
## 7     0.553     0.160
## 8     0.415     0.691
## 10    0.437     0.624
## 11    0.440     0.585
## 12    0.438     0.630
## 13    0.436     0.625
## 14    0.437     0.622
## 17    0.434     0.630
paste("Liczba unikalnych lokalizacji: ", length(gps))
## [1] "Liczba unikalnych lokalizacji:  2"

Lokalizacja wraz z identyfikatorem panelu

gps_with_places_id <- unique(needed_data[c("latitude", "longitude", "place")])
gps_with_places_id
##    latitude longitude place
## 1     0.437     0.631 0.425
## 2     0.437     0.620 0.250
## 3     0.439     0.626 0.350
## 4     0.440     0.612 0.325
## 5     0.436     0.626 0.000
## 6     0.552     0.154 0.375
## 7     0.553     0.160 0.400
## 8     0.415     0.691 0.125
## 9     0.437     0.620 0.225
## 10    0.437     0.624 0.075
## 11    0.440     0.585 0.300
## 12    0.438     0.630 0.150
## 13    0.436     0.625 0.200
## 14    0.437     0.622 0.050
## 15    0.437     0.631 0.025
## 16    0.437     0.622 0.275
## 17    0.434     0.630 0.100

Analiza uzupełnienia wartości

Przed dokonaniem wyliczenia wartości pustych warto zauważyć, że w zbiorze występuje 78521 wierszy, które posiadają wyprodukowaną energię na poziomie 0, 78489 wierszy, które posiadają zmierzony poziom nasłonecznienia na poziomie 0 oraz 72864 wierszy, które posiadają obie wspomniane wartości na poziomie 0. Kierując się tymi obserwacjami, możemy dostrzec, że w przypadku prawie 6 tys. wierszy, które mają nasłonecznienie na poziomie 0 oraz energie większą niż 0 mogła nastąpić awaria czujnika nasłonecznienia, natomiast w przypadku wierszy, które mają nasłonecznienie większe od 0, a wyprodukowaną energię na poziomie 0, elektrownia mogła zostać wyłączona (czujnik dokonywał ciągle pomiarów parametrów środowiska) lub niepoprawnie zapisano liczbę kwh wyprodukowanej energii.

Ciśnienie

Ze względu na to, że w zbiorze występują dla ciśnienia (pressure) tylko wartości zerowe lub większe niż 0.7, uznano, że zerowe wartości są wynikiem awarii czujników i zastąpiono je średnią niezerowych wartości ciśnienia dla określonego panelu.

for(idplace in idplaces) {
  average_value <- mean(needed_data$pressure[needed_data$pressure > 0 & needed_data$place == idplace])
  if(!is.na(average_value)) {
    needed_data$pressure[needed_data$pressure == 0 & needed_data$place == idplace] <- average_value
  }
}

Nasłonecznienie

Założono, że w nocy nasłonecznienie wynosi 0 (co wynika również z analizy pozyskanych danych), stąd zastapiono tylko wartości zerowe dla nasłonecznienia (radiation) z przediału godzinnego <5;20> oraz wyprodukowaną energią większą niż 0. Wartości zerowe zastąpiono średnią wartościa parametru dla danego czujnika w danym miesiącu o danej godzinie.

empty_values <- needed_data %>% filter(radiation == 0 & only_hour > 4 & only_hour  < 20 & energy > 0)
not_empty_values <- needed_data %>% filter(radiation > 0 & only_hour > 4 & only_hour  < 20)
for(idplace in idplaces) {
  empty_radiation <- empty_values %>% filter(place == idplace)
  if(nrow(empty_radiation) > 0) {
    for(i in 1:nrow(empty_radiation)) {
      row <- empty_radiation[i, ]
      cloudcover_low <- row$cloudcover - 0.2
      cloudcover_up <- row$cloudcover + 0.2
      radiation_column <- not_empty_values %>% filter(place == idplace & only_hour == row$only_hour & only_month == row$only_month & cloudcover > cloudcover_low & cloudcover < cloudcover_up) %>% select(radiation)
      if(nrow(radiation_column) > 0) {
        average_value <- mean(radiation_column$radiation)
          if(!is.na(average_value)) {
              needed_data$radiation[which(needed_data$measurementId == row$measurementId)] <- average_value
          }
      }
    }
  }
}

Podstawowe statystyki

Wszystkie wartości w zbiorze oprócz daty wykonania pomiaru zostały znormalizowane. Parametry możemy podzielić na niedyskretne (ze względu na nieznajomość dokładności pomiarów w określonym zakresie działania, np. temperatura przed dokonaniem normalizacji wartości, mogła być mierzona z różną dokładnością w zakresie [x;y]) oraz dyskretne (określony zbiór wartości, np. id panelu). Stąd statystyki danego parametru przedstawiono w zależności od jego typu.

## [1] "Rozmiar zbioru:  235790"

Statystyki wartości niedsykretnych w zbiorze

Średnia Wartość minimalna Wartość maksymalna Odchylenie standardowe Liczba zerowych wartości 1. kwartyl 2. kwartyl 3. kwartyl
age 0.3144706 0.000 1.000 0.3779699 69350 0.0000000 0.1250000 0.719000
temperature 0.3734429 0.045 0.818 0.1722182 0 0.2120000 0.3480000 0.530000
radiation 0.1111735 0.000 0.710 0.1343706 73949 0.0000000 0.0400000 0.208000
pressure 0.7529589 0.730 0.769 0.0044807 0 0.7510000 0.7530000 0.755000
windspeed 0.0762241 0.000 0.696 0.0501477 1070 0.0420000 0.0660000 0.102000
humidity 0.6843925 0.160 1.000 0.1817457 0 0.5400000 0.7000000 0.840000
dewpoint 0.6055304 0.139 0.865 0.0956441 0 0.5350000 0.6190000 0.683000
bearing 0.4512351 0.000 0.769 0.2303888 2520 0.3000000 0.4780000 0.660000
cloudcover 0.3590429 0.000 1.000 0.2595479 38394 0.2300000 0.3100000 0.510000
temp_param 0.1224742 0.009 0.983 0.0631091 0 0.0730000 0.1110000 0.126000
radiation_param 0.2220020 0.108 1.000 0.0115436 0 0.2160000 0.2200000 0.222000
pressure_param 0.0002370 0.000 1.000 0.0039993 233263 0.0000000 0.0000000 0.000000
wind_param 0.0385247 0.000 1.000 0.0048811 2 0.0370000 0.0380000 0.039000
humidity_param 0.0638395 0.034 0.579 0.0420096 0 0.0440000 0.0440000 0.062000
dewpoint_param 0.1193809 0.063 0.415 0.0133907 0 0.1140000 0.1140000 0.118000
bearing_param 0.3454981 0.000 1.000 0.0340350 1 0.3360000 0.3360000 0.339000
cloud_param 0.2061627 0.000 1.000 0.0300724 1 0.1960000 0.1960000 0.198000
distance 0.4686464 0.000 1.000 0.2967915 570 0.1912568 0.4590164 0.726776
altitude 0.5463627 0.111 0.884 0.1806407 0 0.4190000 0.5640000 0.681000
azimuth 0.4545834 0.128 0.818 0.1965414 0 0.2950000 0.4250000 0.635000
altitude_param 0.2055096 0.000 0.982 0.1494217 1 0.0960000 0.1360000 0.266000
azimuth_param 0.3652845 0.000 1.000 0.1822820 1 0.2090000 0.2880000 0.482000
pcnm1 0.4223529 0.000 1.000 0.2043798 13870 0.3770000 0.3780000 0.380000
pcnm2 0.3537647 0.000 0.972 0.2142737 13870 0.2500000 0.3770000 0.422000
pcnm3 0.6044706 0.000 1.000 0.2170462 13870 0.5510000 0.6050000 0.730000
pcnm4 0.5189412 0.000 1.000 0.2555701 13870 0.3630000 0.5310000 0.634000
pcnm5 0.4164706 0.000 1.000 0.2502325 13870 0.3310000 0.4270000 0.462000
pcnm6 0.4940588 0.000 1.000 0.2392556 13870 0.3390000 0.4930000 0.493000
pcnm7 0.1141765 0.000 1.000 0.2249332 13870 0.0310000 0.0520000 0.114000
pcnm8 0.4033529 0.000 1.000 0.2636083 13870 0.2040000 0.4120000 0.511000
pcnm9 0.5371176 0.000 1.000 0.2616246 13870 0.5270000 0.5320000 0.600000
pcnm10 0.6276471 0.000 1.000 0.2123752 13870 0.5530000 0.6190000 0.717000
pcnm11 0.3236471 0.000 1.000 0.2066428 13870 0.2570000 0.3270000 0.327000
pcnm12 0.7567647 0.000 1.000 0.2289319 13870 0.7480000 0.7600000 0.884000
pcnm13 0.6500588 0.137 1.000 0.1995126 0 0.6140000 0.6140000 0.738000
pcnm14 0.4892941 0.000 1.000 0.1838311 13870 0.4320000 0.4730000 0.530000
pcnm15 0.5709412 0.000 1.000 0.2046190 13870 0.6120000 0.6140000 0.615000
mode 0.1767311 0.000 1.000 0.2210455 94008 0.0000000 0.0560000 0.325000
mode_param 0.1967021 -0.025 1.006 0.0534842 2 0.1580000 0.1940000 0.213000
energy 0.1687714 0.000 1.000 0.2106090 78521 0.0000000 0.0490000 0.332000

Statystyki wartości dyskretnych w zbiorze

Wartość minimalna Wartość maksymalna Liczba unikalnych wartości
place 0.000 0.425 17
brand 0.000 0.417 6
latitude 0.415 0.553 9
longitude 0.154 0.691 12
day 0.000 1.000 365
hour 0.000 1.000 19
measurementId 1.000 276488.000 235790
model 0.000 0.750 11
year 2012.000 2013.000 2
icon 0.000 0.750 7

Rozkłady wartości

W tej sekcji zostały przedstawione rozkłady wartości wybranych atrybutów niedyskretnych.

Korelacja

Celem analizy jest znalezienie czynników, które najlepiej wpływają na ilość wyprodukowanej energii. Język statystyki takie związki nazywa korelacją. Gdy korelacja jest dodatnia to wraz ze wzrostem wartości parametru X rośnie wartość parametru Y, natomiast jeśli jest ujemna to wraz ze wzrostem wartości parametru X maleje wartość parametru Y.

Macierz korelacji wszystkich parametrów

Aby obliczyć współczynnik korelacji wykorzystano współczynnik korelacji liniowej Pearsona. Przyjmuje się, że jeśli współczynnik korelacji mieści się pomiędzy <-0.2;0.2> to pomiędzy parametrami X i Y nie występuje korelacja, czyli nie ma związku. Przeanalizowano najpierw, które parametry są najmocniej skorelowane z produkowaną energią (energy). Według przedstawionej macierzy korelacji największy dodatni wpływ na produkowaną energię ma parametr radiation, czyli promieniowanie słoneczne. Natomiast największy negatywny wpływ na produkowaną energię ma parametr humidity, czyli wilgotność. Warto tutaj zauważyć, że związek też spowodowany jest tym, że wzrost promieniowania słonecznego wpływa na zmniejszenie wilgotności, co za tym idzie jeśli wilgotność jest wysoka, to promieniowanie słoneczne ma niższą wartość. Stąd wysoka ujemna korelacja pomiędzy wilgotnością a produkowaną energią. Duży dodatni wpływ na produkowaną energię ma także parametr mode, który jest prawdopodobnie wartością obliczoną na podstawie wartości nasłonecznienia oraz wilgotności (analizując wartości korelacji dla tego parametru). Warto tutaj zauważyć, że zachmurzenie (cloudcover) nie ma praktycznie żadnego wpływu na wartość promieniowania słonecznego (współczynnik korelacji mniejszy niż 0.2).

Wykresy

Na podstawie macierzy korelacji wybrano najciekawsze związki i przedstawiono je na wykresach, osobno dla każdego panelu.

Wykres zależności wyprodukowanej energii od promieniowania słonecznego

Wykres zależności wyprodukowanej energii od wilgotności

Wykres zależności wyprodukowanej energii od parametru mode

Wykres zależności wilgotności od nasłonecznienia

Zmiana wytwarzanej energii w czasie

Zmiana wytwarzanej energii w czasie w ujęciu godzinowym dla każdego panelu

Na przedstawionym wykresie dla niektórych paneli (id 0.05, 0.075, 0.025, 0.425) można zauważyć problem zerowych wartości produkowanej energii, który analizowano wcześniej. Nie zostało stwierdzone, czy w miesiącach, w których wyprodukowana energia jest na niskim poziomie lub zerowym jesy wynikiem błędów pomiarowych czy nieprodukowaniem energii przez elektrownie. Dla lepszej czytelności wykresów w nastepnym punkcie zostanie przedstawiony wykres wyprodukowanej energii przez poszczególne panele w ujęciu miesięcznym.

Zmiana wytwarzanej energii w czasie w ujęciu miesięcznym dla każdego panelu

Na podstawie wykresu wyprodukowanej energii w ujęciu miesięcznym przez poszczególne panele możemy zaobserwować różnice w wyprodukowanej energii w zależności od pory roku. W miesiącach wiosennych i letnich wartości te są zdecydowanie wyższe niż w jesiennych i zimowych, co wskazuje na ogromy wpływ nasłonecznienia na wyprodukowaną energię.

Regresor

Na podstawie macierzy korelacji zdecydowano się wybrać atrybuty radiation, himidity, mode, radiation_param, altitude oraz place (ze względu na konieczność rozróżniania paneli). Zastosowano 3 różne algorytmy: Random Forest, Bayesian Regularized Neural Networks oraz Neural Network (method nnet). Tutaj warto wspomnieć, że pomimo, że atrybut radiation jest skorelowany z atrybutem humidity, to oba te atrybuty wpływają na skuteczność regresora. W momencie wykorzystania algorytmu Random Forest dla ntree = 10, wartość miary RMSE modelu wykorzystującego atrybuty radiation, himidity, mode, radiation_param, altitude oraz place była o 0.002 mniejsza niż modelu radiation, mode, radiation_param, altitude oraz place. Może to wynikać z faktu, że na podstawie rozkładu wartości można zauważyć, że czujnik wilgotności ani razu nie wskazał wartości zerowej (prawdopodobnie nie uległ nigdy awarii), natomiast czujnik nasłonecznienia miał stosunkowo dużo wartości zerowych niewynikających z nocnej pory. Stąd warto zastosować parametr humidity, ze względu na silną korelację z radiation, która jest silnie skorelowana z atrybutem energy (wyprodukowaną energią). Zbiór podzielono według atrybutu place (id panelu) w stosunku 75% zbiór uczący do 25% zbiór testowy.

Random Forest

Podział zbioru na uczący i testowy

set.seed(1)
training_data <- needed_data
inTraining <- 
    createDataPartition(
        y = training_data$place,
        p = .75,
        list = FALSE)

training <- training_data[ inTraining,]
testing  <- training_data[-inTraining,]

Proces uczenia

set.seed(1)
ctrl <- trainControl(
    method = "repeatedcv",
    number = 2,
    repeats = 5)
    
fit <- train(energy ~ radiation + humidity + mode + radiation_param + altitude +  place,
             data = training,
             method = "rf",
         metric = "RMSE",
             trControl = ctrl, 
        ntree = 30)
fit
## Random Forest 
## 
## 176843 samples
##      6 predictors
## 
## No pre-processing
## Resampling: Cross-Validated (2 fold, repeated 5 times) 
## Summary of sample sizes: 88422, 88421, 88422, 88421, 88421, 88422, ... 
## Resampling results across tuning parameters:
## 
##   mtry  RMSE        Rsquared   MAE       
##   2     0.07003180  0.8894338  0.03453232
##   4     0.07023014  0.8887463  0.03424576
##   6     0.07101865  0.8862121  0.03448099
## 
## RMSE was used to select the optimal model using  the smallest value.
## The final value used for the model was mtry = 2.

Predykcja

pred <- predict(fit, newdata = testing)
dat <- data.frame(obs =  testing$energy,
                  pred = pred)
defaultSummary(dat)
##       RMSE   Rsquared        MAE 
## 0.06831101 0.89518297 0.03326828

Podział zbioru na uczący i testowy (test dla atrybutu radiation)

Najsilniej skorelowane z energią jest nasłonecznienie. Postanowiono sprawdzić jaką wartość RMSE można uzyskać, stosując w modelu tylko ten atrybut.

set.seed(1)
training_data <- needed_data
inTraining <- 
    createDataPartition(
        y = training_data$place,
        p = .75,
        list = FALSE)

training <- training_data[ inTraining,]
testing  <- training_data[-inTraining,]

Proces uczenia (test dla atrybutu radiation)

set.seed(1)
ctrl <- trainControl(
    method = "repeatedcv",
    number = 2,
    repeats = 5)
    
fit <- train(energy ~ radiation  +  place,
             data = training,
             method = "rf",
         metric = "RMSE",
             trControl = ctrl, 
        ntree = 30)
## note: only 1 unique complexity parameters in default grid. Truncating the grid to 1 .
fit
## Random Forest 
## 
## 176843 samples
##      2 predictors
## 
## No pre-processing
## Resampling: Cross-Validated (2 fold, repeated 5 times) 
## Summary of sample sizes: 88422, 88421, 88422, 88421, 88421, 88422, ... 
## Resampling results:
## 
##   RMSE        Rsquared   MAE       
##   0.09764856  0.7858871  0.05140049
## 
## Tuning parameter 'mtry' was held constant at a value of 2

Predykcja (test dla atrybutu radiation)

pred <- predict(fit, newdata = testing)
dat <- data.frame(obs =  testing$energy,
                  pred = pred)
defaultSummary(dat)
##       RMSE   Rsquared        MAE 
## 0.09537819 0.79567636 0.05019922

Bayesian Regularized Neural Networks

Podział zbioru na uczący i testowy

set.seed(1)
training_data <- needed_data
inTraining <- 
    createDataPartition(
        y = training_data$place,
        p = .75,
        list = FALSE)

training <- training_data[ inTraining,]
testing  <- training_data[-inTraining,]

Proces uczenia

set.seed(1)
ctrl <- trainControl(
    method = "repeatedcv",
    number = 2,
    repeats = 5)
    
fit2 <- train(energy ~ radiation + humidity + mode + radiation_param + altitude +  place,
             data = training,
             method = "brnn",
         metric = "RMSE",
             trControl = ctrl)
fit2
## Bayesian Regularized Neural Networks 
## 
## 176843 samples
##      6 predictors
## 
## No pre-processing
## Resampling: Cross-Validated (2 fold, repeated 5 times) 
## Summary of sample sizes: 88422, 88421, 88422, 88421, 88421, 88422, ... 
## Resampling results across tuning parameters:
## 
##   neurons  RMSE        Rsquared   MAE       
##   1        0.09694454  0.7879659  0.05729408
##   2        0.09371587  0.8018536  0.05294644
##   3        0.09035640  0.8158006  0.05113617
## 
## RMSE was used to select the optimal model using  the smallest value.
## The final value used for the model was neurons = 3.

Predykcja

pred <- predict(fit2, newdata = testing)
dat <- data.frame(obs =  testing$energy,
                  pred = pred)
defaultSummary(dat)
##       RMSE   Rsquared        MAE 
## 0.09113579 0.81315713 0.05075198

Neural Network (nnet)

Podział zbioru na uczący i testowy

set.seed(1)
training_data <- needed_data
inTraining <- 
    createDataPartition(
        y = training_data$place,
        p = .75,
        list = FALSE)

training <- training_data[ inTraining,]
testing  <- training_data[-inTraining,]

Proces uczenia

set.seed(1)
ctrl <- trainControl(
    method = "repeatedcv",
    number = 2,
    repeats = 5)
    
fit3 <- train(energy ~ radiation + humidity + mode + radiation_param + altitude +  place,
             data = training,
             method = "nnet",
         metric = "RMSE",
             trControl = ctrl)
fit3
## Neural Network 
## 
## 176843 samples
##      6 predictors
## 
## No pre-processing
## Resampling: Cross-Validated (2 fold, repeated 5 times) 
## Summary of sample sizes: 88422, 88421, 88422, 88421, 88421, 88422, ... 
## Resampling results across tuning parameters:
## 
##   size  decay  RMSE        Rsquared   MAE       
##   1     0e+00  0.26966245        NaN  0.16850448
##   1     1e-04  0.13286045  0.6227858  0.09957540
##   1     1e-01  0.09745924  0.7868284  0.06139062
##   3     0e+00  0.26966245        NaN  0.16850448
##   3     1e-04  0.09324184  0.8040090  0.05393728
##   3     1e-01  0.09269987  0.8067932  0.05588442
##   5     0e+00  0.17929882  0.8216360  0.10923112
##   5     1e-04  0.09535040  0.7936911  0.05661704
##   5     1e-01  0.09087021  0.8144727  0.05471414
## 
## RMSE was used to select the optimal model using  the smallest value.
## The final values used for the model were size = 5 and decay = 0.1.

Predykcja

pred <- predict(fit3, newdata = testing)
dat <- data.frame(obs =  testing$energy,
                  pred = pred)
defaultSummary(dat)
##       RMSE   Rsquared        MAE 
## 0.09213618 0.80954894 0.05487129

Podsumowanie

Naniższą wartość RMSE osiągnięto dla algorytmu Random Forest. Na podstawie przeprowadzonych testów stwierdzono, że wartość ntree = 30 jest najkorzystniejsza jeśli chodzi o wartość miary RMSE i czas wykonania (powyżej tej wartości czas uczenia bardzo się wydłuża, przy polepszeniu RMSE o mniej niż 0.0001). Najważniejszym atrybutem w modelu jest nasłonecznienie (radiation).